package chapter07

object Test15_HighLevelFunction_Reduce {
  def main(args: Array[String]): Unit = {
    val list = List(1, 2, 3, 4)
    // 累加数据
    println(list.reduce(_+_))
    // 从左右累加
    println(list.reduceLeft(_+_))
    list.reduceRight(_+_)

    // 从前往后 对于 加法而言，看起来貌似没有什么
    // 但是对于减法而言，会有所区别
    val list3 = List(3, 4, 5, 8, 10)
    //
    list.reduce(_-_)
    list.reduceLeft(_-_)
    // 这个结果不一样，因为内部类似递归调用
    // 实际的运算规则是 3 - (4-(5-(8-(10))))
    list.reduceRight(_-_)

    // fold 此方法可以给定一个初始值，然后将初始值作为起点
    // 进行累加
    println(list.fold(10)(_+_))
    println(list.foldLeft(10)(_-_))
    //  reverse.foldLeft(z)((right, left) => op(left, right))
    //List(3, 4, 5, 8, 10)->List(10, 8, 5, 4, 3)
    // 5-(8-(10-11)) ...
    println(list.foldRight(11)(_-_))

  }
}
